
#ifndef _MATHLIB_H_
#define _MATHLIB_H_

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

/*Inverte a string. Ex: abc -> cba*/
void swap(char *string){
	int size = 0, i;
	char aux;

	size = strlen(string);

	for(i = 0; i < size/2; i++){
		aux = string[i];
		string[i] = string[(size-1)-i];
		string[(size-1)-i] = aux;
	}/*fim for*/
}/*fim swap*/

/*Converte de Decimal para Binario. Retorna uma string com este valor
Desaloque a memoria quando terminar de usar!!!!*/
char* decToBin(int dec){
	int i = 0;
	char a, b;
	char *binary = (char*) malloc(sizeof(char)*9);/*numeros com ate oito bits*/

	/*verifica a necessidade de fazer o complemento de 1*/
	if(dec >= 0){
		a = '0';
		b = '1';
	}/*fim if*/
	else{
		a = '1';
		b = '0';
		dec = dec*(-1);
	}/*fim else*/

	/*Convertendo para binario*/
	do{
		if(dec%2 == 0)
			binary[i++] = a;/*se dec for positivo, a='1'*/
		else
			binary[i++] = b;/*se dec for positivo b='0'*/
		dec = dec/2;

	}while(dec > 0);

	binary[i] = '\0';/*Caracter terminador de string*/
	swap(binary);/*inverte a string, pois o codigo no do while da o numero na forma inversa*/

	return binary;
}/*fim decToBin*/

/*Converte de Binario para Decimal. Retorna um inteiro com este valor*/
int binToDec(char* binary){
	int size = 0, dec = 0, i;
	char a;

	/*se comecar com 1 o numero eh positivo. Caso contrario eh negativo*/
	if(binary[0] == '1')
		a = '1';
	else
		a = '0';

	size = strlen(binary);

	/*Convertendo para Decimal*/
	for(i = 0; i < size; i++){
		if(binary[i] == a)
			dec = dec + (int) pow(2.0,(double)((size-1)-i));
	}/*fim for*/

	return a == '1'? dec : dec*(-1);
}/*fim binToDec*/

/*Converte Binario de 8 bits (sem sinal) para Decimal. Retorna um inteiro com este valor*/
int binToDecPure(char* binary){
	int size = 0, dec = 0, i;

	size = strlen(binary);

	/*Convertendo para Decimal*/
	for(i = 0; i < size; i++){
		if(binary[i] == '1')
			dec = dec + (int) pow(2.0,(double)((size-1)-i));
	}/*fim for*/

	return dec;
}/*fim binToDec*/

/*Converte para binario de 8 bits(sem sinal).*/
char* decToBinPure(int dec){
	int i = 0;
	char *binary = (char*) malloc(sizeof(char)*9);/*numeros com ate oito bits*/

	/*verifica a necessidade de fazer o complemento de 1*/

	/*Convertendo para binario*/
	do{
		if(dec%2 == 0)
			binary[i++] = '0';
		else
			binary[i++] = '1';
		dec = dec/2;

	}while(dec > 0);
	while(i != 8){ binary[i++] = '0'; }
	binary[i] = '\0';/*Caracter terminador de string*/

	swap(binary);/*inverte a string, pois o codigo no do while da o numero na forma inversa*/

	return binary;
}/*fim decToBin*/

/*

Retorna a quantidade de bits para representar o numero num*/
int numberOfBits(int num){
	double result, aux;
	int ret;

	/*aux = (double) num;
	if(num == 0) return 0;
	
	if(num < 0) num = num*(-1);*/

	if(num == 0) return 0;
	if(num < 0) num = num*(-1);
	aux = (double)num;

	result = (double)log(aux)/log(2.0);
	ret = (int) ceil(result);
	
	return(ret == (int) floor(result)? ret+1: ret);
	
}

int retornaMaior(int a, int b, int c) {
	if(a >= b && a >= c)
		return a;
	if(b >= c && b >= a)
		return b;
	if(c >= a && c >= b)
		return c;
	else
		return a;
}

#endif

